package main

import "fmt"
import "unsafe"

// ==========整数类型==========
// 1、整型默认为int类型, 用fmt.Printf("%T", variable)格式化输出查看变量类型
// 2、变量占用的字节数可用unsafe.Sizeof(variable)查看, 是变量的数据类型占用的字节数, 而不是变量存储空间的字节数

// 类型		有无符号		占用存储空间		范围					备注
// int		有			8字节			-2^63 ~ 2^63 -1		32位操作系统0 ~ 2^32 - 1
// int8		有			1字节			-128 ~ 127
// int16	有			2字节			-2^15 ~ 2^15 -1
// int32	有			4字节			-2^31 ~ 2^31 - 1
// int64	有			8字节			-2^63 ~ 2^63 -1
// rune		有			4字节			-2^31 ~ 2^31 - 1	等价于int32, 表示一个Unicode码
// uint		无			8字节			0 ~ 2^64 - 1		32位操作系统0 ~ 2^32 - 1
// uint8	无			1字节			0 ~ 255
// uint16	无			2字节			0 ~ 2^16 - 1
// uint32	无			4字节			0 ~ 2^32 - 1
// uint64	无			8字节			0 ~ 2^64 - 1
// byte		无			1字节			0 ~ 255				等价于uint8(可用于存储字符)

func main() {
	// byte可表示任一个ASCII码, ASCII码值从0 ~ 127
	var char byte
	char = 'A'
	fmt.Println(char) // 打印结果是ASCII对应的码值65

	// 查看数据类型占用的字节数
	s := make([]int, 0)
	fmt.Println(unsafe.Sizeof(s)) // 创建一个切片所占用的字节数是24
	for i := 0; i < 10000; i++ {
		s = append(s, 1)
	}
	fmt.Println(unsafe.Sizeof(s)) // 往切片中添加任意元素后依然是24

	// 整数的八进制表示形式, 前面加0
	var i = 077
	fmt.Println(i) // 63

	// 整数的十六进制表示形式, 前面加0x
	var j = 0xff
	fmt.Println(j) // 255

	// Go中不能直接表示二进制数, 只能格式化输出
	fmt.Printf("%b\n", 5) // 101
}
